package experiment4;

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class MNISTLoader {

    // 读取MNIST训练集图像数据
    public static byte[] readMNISTImages(String filePath) throws IOException {
        FileInputStream fis = new FileInputStream(filePath);
        DataInputStream dis = new DataInputStream(fis);

        // 跳过前16个字节（文件头部分）
        dis.skipBytes(0);

        // 每张图像是28x28像素，总共60000张图像
        byte[] imageBytes = new byte[60000 * 28 * 28];  // 28*28 = 784像素
        dis.readFully(imageBytes); // 读取图像数据

        dis.close();  // 关闭流
        return imageBytes;
    }

    // 读取MNIST标签数据
    public static byte[] readMNISTLabels(String filePath) throws IOException {
        FileInputStream fis = new FileInputStream(filePath);
        DataInputStream dis = new DataInputStream(fis);

        // 跳过前8个字节（文件头部分）
        dis.skipBytes(8);

        // 总共有60000个标签
        byte[] labelBytes = new byte[60000];
        dis.readFully(labelBytes); // 读取标���数据

        dis.close();  // 关闭流
        return labelBytes;
    }

    // 主函数：测试数据读取
    public static void main(String[] args) throws IOException {
        // 指定文件路径
        String imageFilePath = "D:\\Java\\projects\\practice\\AIGC\\src\\experiment4\\MNIST\\train-images.idx3-ubyte";  // 图像数据文件路径
        String labelFilePath = "D:\\Java\\projects\\practice\\AIGC\\src\\experiment4\\MNIST\\train-labels.idx1-ubyte";  // 标签数据文件路径

        // 读取数据
        byte[] images = readMNISTImages(imageFilePath);
        byte[] labels = readMNISTLabels(labelFilePath);

        // 输出一些数据验证
        System.out.println("读取了 " + images.length / (28 * 28) + " 张图像！");
        System.out.println("标签数据：第一个标签是 " + labels[0]);
    }
}

